/*
* Copyright (c) 2016 ShopJsp. All Rights Reserved.
 * ============================================================================
 * 版权所有 2011 - 今 北京华宇盈通科技有限公司，并保留所有权利。
 * ----------------------------------------------------------------------------
 * 提示：在未取得SHOPJSP商业授权之前，您不能将本软件应用于商业用途，否则SHOPJSP将保留追究的权力。
 * ----------------------------------------------------------------------------
 * 官方网站：http://www.shopjsp.com
 * ============================================================================
*/
package com.hyyt.shopjsp.util.number;

import com.hyyt.shopjsp.util.common.EnumUtils;
import org.apache.commons.lang.StringUtils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;

/**
 * SerialNumberUtil - 编号生成工具类（订单编号、支付编号、退款编号、发货编号、退货编号）
 * ============================================================================
 * 版权所有 2010-2013 XXXX软件有限公司，并保留所有权利。
 * ----------------------------------------------------------------------------
 * 提示：在未取得SHOPJSP商业授权之前，您不能将本软件应用于商业用途，否则SHOPJSP将保留追究的权力。
 * ----------------------------------------------------------------------------
 * 官方网站：http://www.shopjsp.com
 * ============================================================================
 */
public class SerialNumberUtil {
    /**
     * 生成当前时间（yyyyMMddHHmmssSSS）
     * @return 当前时间
     */
    public static String createTime(){
        Date createTime = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat(EnumUtils.DataFormat.YMDHmsS.getValue());
        String currentTime = sdf.format(createTime);
        return currentTime;
    }

    /**
     * 获取一定长度的随机字符串
     * @param length 指定字符串长度
     * @return 一定长度的字符串
     */
    public static String genRandomNum(int length) {
        String base = "0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }

    /**
     * 生成订单编号(30位)
     *
     * @return 订单编号
     */
    public static String orderSnNumber() {
        String num = genRandomNum(8);
        String ordersNo = createTime()+num;
        return ordersNo;
    }

    /**
	 * 生成资金流水明细编号(30位，默认20位)
	 * @return 明细流水号
	 */
	public static String fundSnNumber(){
        String num = genRandomNum(8);
		String fundNo = createTime()+num;
		return fundNo;
    }
    /**
     * 生成支付编号(30位，默认20位)
     * @return 支付编号
     */
    public static String paymentSnNumber() {
        String num = genRandomNum(8);
        String paymentNo = createTime()+num;
        return paymentNo;
    }

    /**
     * 生成虚拟金币编号(30位)
     *
     * @return 虚拟金币编号
     */
    public static String virtualCoinNumber() {
        String num = genRandomNum(8);
        String returnsApplyNo = createTime()+num;
        return returnsApplyNo;
    }

    /**
     * 生成退款编号(30位)
     *
     * @return 退款编号
     */
    public static String refundSnNumber() {
        String num = genRandomNum(8);
        String refundNo = createTime()+num;
        return refundNo;
    }

    /**
     * 生成发货编号(30位)
     *
     * @return 发货编号
     */
    public static String shippingSnNumber() {
        String num = genRandomNum(8);
        String shippingSNo = createTime()+num;
        return shippingSNo;
    }

    /**
     * 生成退货编号(30位)
     *
     * @return 退货编号
     */
    public static String reshipSnNumber() {
        String num = genRandomNum(8);
        String shippingSNo = createTime()+num;
        return shippingSNo;
    }

    /**
     * 金币明细编号(30位)
     *
     * @return 金币明细编号
     */
    public static String integralSnNumber() {
        String num = genRandomNum(8);
        String returnsApplyNo = createTime()+num;
        return returnsApplyNo;
    }

    /**
     * 金币明细编号(30位)
     *
     * @return 金币明细编号
     */
    public static String redbagCode() {
        Double random = Math.random();
        String num = random.toString().substring(2, 4);
        String redbagCode = createTime() + num;
        return redbagCode;
    }

    /**
     * 充值明细编号(30位)
     *
     * @return 充值明细编号
     */
    public static String rechargeSheetSnNumber() {
        String num = genRandomNum(8);
        String rechargeSheet = createTime() + num;
        return rechargeSheet;
    }

    /**
     * 采购计划编号(30位)
     *
     * @return 采购计划编号
     */
    public static String purchaseNumber() {
        String num = genRandomNum(8);
        String rechargeSheet = createTime() + num;
        return rechargeSheet;
    }

    /**
     * 验收单编号(30位)
     *
     * @return 验收单编号
     */
    public static String checkNumber() {
        String num = genRandomNum(8);
        String rechargeSheet = createTime() + num;
        return rechargeSheet;
    }

    /**
     * 仓库编号(30位)
     *
     * @return 仓库编号
     */
    public static String storageNumber() {
        String num = genRandomNum(8);
        String rechargeSheet = createTime() + num;
        return rechargeSheet;
    }

    /**
     * 入库单编号(30位)
     *
     * @return 入库单编号
     */
    public static String storeNoNumber() {
        String num = genRandomNum(8);
        String rechargeSheet = createTime() + num;
        return rechargeSheet;
    }

    /**
     * 配送单编号(30位)
     *
     * @return 配送单编号
     */
    public static String sendNoNumber() {
        String num = genRandomNum(8);
        String rechargeSheet = createTime() + num;
        return rechargeSheet;
    }

    /**
     * 报损报益单编号(30位)
     *
     * @return 报损报益单
     */
    public static String profitLossNumber() {
        String num = genRandomNum(8);
        String rechargeSheet = createTime() + num;
        return rechargeSheet;
    }

    /**
     * 报损报益单编号(30位)
     *
     * @return 报损报益单
     */
    public static String backOrderNoNumber() {
        String num = genRandomNum(8);
        String rechargeSheet = createTime() + num;
        return rechargeSheet;
    }

    /**
     * 库存 流水号(30位)
     *
     * @return 库存 流水号
     */
    public static String serialNoNumber() {
        String num = genRandomNum(8);
        String rechargeSheet = createTime() + num;
        return rechargeSheet;
    }

    /**
     * 商品编号(30位)
     *
     * @return 商品编号
     */
    public static String productCode() {
        String num = genRandomNum(8);
        String productCode = createTime()+num;
        return productCode;
    }

    /**
     * 退换货单号(30位)
     *
     * @return 退换货单号
     */
    public static String returnsApplyNoNumber() {
        String num = genRandomNum(8);
        String returnsApplyNo = createTime()+num;
        return returnsApplyNo;
    }

    /**
     * 金币明细流水号(30位)
     *
     * @return 金币明细流水号
     */
    public static String returnsIntegralNumber() {
        String num = genRandomNum(8);
        String no = createTime() + num;
        return no;
    }
    
    /**
     * 生成唯一的uuid
     *
     * @return string
     */
    public static String uuidGenerate() {
        UUID uuid = UUID.randomUUID();
        return uuid.toString().replace("-", "");
    }

    /**
     * 根据用户编号生成10位随机全局唯一邀请码
     *
     * @return 10位邀请码
     */
    public static String geneInvitationCode(String customerId) {
        if (StringUtils.isBlank(customerId)) customerId = "";
        String chars = "56789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int strLength = 10 - customerId.length();
        for (int i = 0; i < strLength; i++) {
            customerId += chars.charAt((int) (Math.random() * 26));
        }
        return customerId;
    }

    /**
     * 根据2位随机字母+10位日期+4位随机数生成商品的SKU值
     *
     * @return 10位邀请码
     */
    public static String generateSkuCode() {
        StringBuffer sb_sku=new StringBuffer();
        String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        sb_sku.append(chars.charAt((int) (Math.random() * 26))).append(chars.charAt((int) (Math.random() * 26)));//获取2位随机字母
        sb_sku.append(new SimpleDateFormat("YYMMddHHmmss").format(new Date()));//获取12位随机字母
        sb_sku.append(((int)(Math.random()*9+1))*1000);//获取4位随机数
        return sb_sku.toString();
    }

}
